package com.atguigu.java.ai.langchain4j.tools;

import com.atguigu.java.ai.langchain4j.entity.Appointment;
import com.atguigu.java.ai.langchain4j.service.AppointmentService;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Author 杨轲
 * @Date 2025/5/10 15:20
 * @Version 1.0
 * @description: 该工具类是为了实现智能聊天自动预约取消挂号的功能
 * @Component 是 Spring 框架的注解，用于标识该类是一个 Spring 组件，能被自动扫描并注册为 Spring 容器中的 Bean。
 */
@Component
public class AppointmentTools {
    @Autowired
    AppointmentService appointmentService;


    //预约挂号

    @Tool(name = "预约挂号",value = "根据参数，先执行工具方法queryDepartment查询是否可以预约，并直接给用户回答" +
            "是否可以预约，并让用户确认其预约信息进行预约，如果用户没有提供具体的医生姓名，请从\n" +
            "向量存储中找到一位医生。")
    public String bookAppointment(Appointment appointment){
        //查询是否已经预约过了
        Appointment appointmentDB = appointmentService.getOne(appointment);
        if (appointmentDB==null){
            appointment.setId(null); //因为mysql设置了主键自增防止ai生成id
            if (appointmentService.save(appointment)){
                return "预约成功，并返回预约详情";
            }else {
                return "预约失败";
            }
        }
        return "你已经预约过了不能重复预约";
    }

    //取消预约挂号

    @Tool(name="取消预约挂号",value = "根据参数信息查询预约是否存在，如果存在则删除预约信息并返回取消预约成功，否则返回取消预约失败")
    public String cancelAppointment(Appointment appointment) {
        Appointment cancelAppointmentDB = appointmentService.getOne(appointment);
        if (cancelAppointmentDB != null) {
            if (appointmentService.removeById(cancelAppointmentDB.getId())) {
                return "取消预约成功";
            }else{
                return "取消预约失败";
            }
        }
        return "您没有预约记录，请核对预约科室和时间";
    }

    //查询是否有号源
    @Tool(name = "查询是否有号源", value = "根据科室 日期，时间的上下午，医生的名字确定是否有号源")
    public boolean queryDepartment(
          @P(value = "科室名称") String name,
          @P(value = "日期") String date,
          @P(value = "时间，上午或则下午") String time,
          @P(value ="医生的名字",required = false) String dockerName   //可以不填
    ) {

        //TODO 现实中得去从业务中查询，所以这里写伪代码

        //若是没有指定医生的名字，则直接去科室中查询有可以预约的医生 有返回true 否则false
        //若是指定了对应医生的名字，则去查询该科室医生是否有排班
        //若是没有排班返回false 有排班的话再查询是否已经预约满，没满返回true满了返回false


        return true;
    }
}
